// 版权所有2009 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build aix | darwin | | | | | | | | | | | | | | | | | | | | | | | |，！illumos 

package os

import "syscall"

// 管道返回一对连接的文件；从r读取并返回写入w的字节。
// 返回文件和错误（如果有）。
func Pipe() (r *File, w *File, err error) {
	var p [2]int

	// 有关锁的说明，请参见../syscall/exec.go。
	syscall.ForkLock.RLock()
	e := syscall.Pipe(p[0:])
	if e != nil {
		syscall.ForkLock.RUnlock()
		return nil, nil, NewSyscallError("pipe", e)
	}
	syscall.CloseOnExec(p[0])
	syscall.CloseOnExec(p[1])
	syscall.ForkLock.RUnlock()

	return newFile(uintptr(p[0]), "|0", kindPipe), newFile(uintptr(p[1]), "|1", kindPipe), nil
}
